package com.etrans.web.gps.business.system.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.etrans.web.gps.base.service.BaseService;
import com.etrans.web.gps.business.system.domain.AreaCheck;
import com.etrans.web.gps.business.system.domain.CheckResult;
import com.etrans.web.gps.business.system.domain.QueryAreaCheck;
import com.etrans.web.gps.business.system.domain.Strategy;
import com.etrans.web.gps.common.Constant;
import com.etrans.web.gps.common.MGTemplete;
import com.etrans.web.gps.util.Config;
import com.etrans.web.gps.util.MongodbConfig;
import com.mongodb.BasicDBObject;
import com.mongodb.client.model.UpdateOptions;
/**
 * 区域查岗service
 * @author Tan
 *
 */
@Service
public class AreaCheckService extends BaseService {

	private static final Logger logger = LoggerFactory.getLogger(AreaCheckService.class);

	@Autowired
	private MGTemplete mgTemplete; // mongodb 操作类
	
	@Autowired
	private CommonService commonService;
	
	@Autowired
	private Config config;

	/**
	 * 区域查岗列表
	 * 
	 * @return List<AreaCheck>
	 */
	@SuppressWarnings("static-access")
	public List<QueryAreaCheck> queryAreaCheckList(Map<String, Object> paramMap) {

		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 查询条件封装
		HashMap<String, Object> whereMap = new HashMap<>();
		HashMap<String, Date> where = new HashMap<>();
		HashMap<String, List<Integer>> where1 = new HashMap<>();
		HashMap<String, Object> sortMap = new HashMap<>();
		// 开始时间
		String startTime = paramMap.get("startTime").toString();
		// 结束时间
		String endTime = paramMap.get("endTime").toString();
		if(StringUtils.isNotBlank(startTime)){
			try {
				where.put("$gte", format.parse(startTime+" 00:00:00"));// 大于
			} catch (ParseException e) {
				e.printStackTrace();
			} 
		}
		if(StringUtils.isNotBlank(endTime)){
			try {
				where.put("$lte", format.parse(endTime+" 23:59:59"));// 小于
			} catch (ParseException e) {
				e.printStackTrace();
			} 
		}
		// 值不为空时 把参数拼进去
		if(!where.isEmpty()){
			whereMap.put("check_time", where);
		}
		int page 	  = Integer.valueOf(paramMap.get("page").toString());		// 当前显示页数
		int pageSize  = Integer.valueOf(paramMap.get("pageSize").toString());	// 每页记录数
		// 区域查岗id
		String checkAreaId = paramMap.get("checkAreaId").toString();
		if(StringUtils.isNotBlank(checkAreaId)){
			// 界面要实现树形查询、这里需要查询mysql找到参数对应的区域id
			HashMap<String, Object> param  = new HashMap<>();
			param.put("FullID", checkAreaId);
			List<HashMap<String, Object>> queryAreaTree = commonService.queryAreaTree(param);
			List<Integer> listAreaIds = new ArrayList<>();
			if(queryAreaTree != null && queryAreaTree.size() > 0 ){
				for (HashMap<String, Object> hashMap : queryAreaTree) {
					// 所有的区域id
					listAreaIds.add(Integer.valueOf(hashMap.get("ID").toString()));
				}
				where1.put("$in", listAreaIds);
				whereMap.put("check_area_id", where1);	// 值不为空时 把参数拼进去
			}
		}else{
			if(paramMap.get("FullID")!=null){
				HashMap<String, Object> param  = new HashMap<>();
				param.put("FullID", paramMap.get("FullID"));
				List<HashMap<String, Object>> queryAreaTree = commonService.queryAreaTree(param);
				List<Integer> listAreaIds = new ArrayList<>();
				if(queryAreaTree != null && queryAreaTree.size() > 0 ){
					for (HashMap<String, Object> hashMap : queryAreaTree) {
						// 所有的区域id
						listAreaIds.add(Integer.valueOf(hashMap.get("ID").toString()));
					}
					where1.put("$in", listAreaIds);
					whereMap.put("check_area_id", where1);	// 值不为空时 把参数拼进去
				}else{
					logger.info("当前登录人查询区域查岗记录操作---->数据权限---->当前登录人没有区域对应的区域id step1");
				}
			}else{
				logger.info("当前登录人查询区域查岗记录操作---->数据权限---->当前登录人没有区域对应的区域id step2");
			}
		}
		// 排序
		String sortorder = paramMap.get("sortorder").toString();
		if(StringUtils.isNotBlank(sortorder)){
			if(sortorder.contains("desc")){
				sortMap.put("check_time", Constant.MONGODB_DESC);					// 降序排序
			}
			if(sortorder.contains("asc")){
				sortMap.put("check_time", Constant.MONGODB_ASC);					// 升序排序
			}
		}
		logger.info("{}{}查询条件   > 区域查岗id {}" + paramMap.get("checkAreaId") + "{}开始日期{}" + paramMap.get("startTime").toString()
				+ "{}{}结束日期{}{}" + paramMap.get("endTime").toString());
		// MONGODB 查询结果集返回List
		List<QueryAreaCheck> list = mgTemplete.find(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER,whereMap,sortMap,page, pageSize,QueryAreaCheck.class);

		return list;
	}

	/**
	 * 区域查岗总条数
	 * 
	 * @return List<AreaCheck>
	 */
	@SuppressWarnings("static-access")
	public Integer queryAreaCheckListCount(Map<String, Object> paramMap) {
		Long count = 0L;
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 查询条件封装
		HashMap<String, Object> whereMap = new HashMap<>();
		HashMap<String, Date> where = new HashMap<>();
		HashMap<String, List<Integer>> where1 = new HashMap<>();
		// 开始时间
		String startTime = paramMap.get("startTime").toString();
		// 结束时间
		String endTime = paramMap.get("endTime").toString();
		if(StringUtils.isNotBlank(startTime)){
			try {
				where.put("$gte", format.parse(startTime+" 00:00:00"));// 大于
			} catch (ParseException e) {
				e.printStackTrace();
			} 
		}
		if(StringUtils.isNotBlank(endTime)){
			try {
				where.put("$lte", format.parse(endTime+" 23:59:59"));// 小于
			} catch (ParseException e) {
				e.printStackTrace();
			} 
		}
		// 值不为空时 把参数拼进去
		if(!where.isEmpty()){
			whereMap.put("check_time", where);
		}
		// 区域查岗id
		String checkAreaId = paramMap.get("checkAreaId").toString();
		if(StringUtils.isNotBlank(checkAreaId)){
			// 界面要实现树形查询、这里需要查询mysql找到参数对应的区域id
			HashMap<String, Object> param  = new HashMap<>();
			param.put("FullID", checkAreaId);
			List<HashMap<String, Object>> queryAreaTree = commonService.queryAreaTree(param);
			List<Integer> listAreaIds = new ArrayList<>();
			if(queryAreaTree != null && queryAreaTree.size() > 0 ){
				for (HashMap<String, Object> hashMap : queryAreaTree) {
					// 所有的区域id
					listAreaIds.add(Integer.valueOf(hashMap.get("ID").toString()));
				}
				where1.put("$in", listAreaIds);
				whereMap.put("check_area_id", where1);	// 值不为空时 把参数拼进去
			}
		}else{
			if(paramMap.get("FullID")!=null){
				HashMap<String, Object> param  = new HashMap<>();
				param.put("FullID", paramMap.get("FullID"));
				List<HashMap<String, Object>> queryAreaTree = commonService.queryAreaTree(param);
				List<Integer> listAreaIds = new ArrayList<>();
				if(queryAreaTree != null && queryAreaTree.size() > 0 ){
					for (HashMap<String, Object> hashMap : queryAreaTree) {
						// 所有的区域id
						listAreaIds.add(Integer.valueOf(hashMap.get("ID").toString()));
					}
					where1.put("$in", listAreaIds);
					whereMap.put("check_area_id", where1);	// 值不为空时 把参数拼进去
				}else{
					logger.info("当前登录人查询区域查岗记录操作---->数据权限---->当前登录人没有区域对应的区域id step1");
				}
			}else{
				logger.info("当前登录人查询区域查岗记录操作---->数据权限---->当前登录人没有区域对应的区域id step2");
			}
		}
		// MONGODB 查询结果集返回List
		 count = mgTemplete.findCount(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER,whereMap);

		return count.intValue();
	}
	
	/**
	 * 区域查岗策略设置列表查询
	 * 
	 * @return List<Strategy>
	 */
	public List<Strategy> queryAreaAllStrategys(Map<String, Object> params) {
		return this.selectList("strategyQuery.queryAreaAllStrategys", params);
	}
	
	
	/**
	 * 区域查岗策略设置总条数
	 * 
	 * @return long
	 */
	public long areaAllStrategysCount(Map<String, Object> params) {
		return (Long) this.selectOne("strategyQuery.areaAllStrategysCount", params);
	}

	/**
	 * 区域查岗策略设置删除
	 * 
	 * @return int
	 */
	public int deleteStrategy(int strategyId) {
		return this.delete("strategyMapper.deleteStrategy", strategyId);
		
	}

	/**
	 * 区域查岗策略设置保存
	 * 
	 * @return int
	 */
	public int saveStrategy(Strategy strategy) {
		this.insert("strategyMapper.saveStrategy", strategy);
		return strategy.getId();
	}

	/**
	 * 查岗方式：手动 区域查岗保存MONGODB
	 * @param areaCheck
	 */
	@SuppressWarnings("static-access")
	public void insertAreaCheckToMongodb(AreaCheck areaCheck) {	
		mgTemplete.insertOne(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER, areaCheck);
	}

	/**
	 * 当前登录人对应的区域查岗记录 查询15分钟之内的记录
	 * @param params
	 * @return
	 */
	@SuppressWarnings("static-access")
	public List<QueryAreaCheck> findAreaCheck(HashMap<String, Object> params) {
		// 查询条件封装
		HashMap<String, Object> whereMap = new HashMap<>();
		HashMap<String, Date> where = new HashMap<>();
		HashMap<String, Object> sortMap = new HashMap<>();
		long curren = System.currentTimeMillis();// 系统时间
		Date endTime = new Date(curren);
		where.put("$lte", endTime);// 小于
		curren = curren - config.areaCheckTaskTimers;
		Date startTime = new Date(curren);
		where.put("$gte", startTime);// 大于
		
		// 值不为空时 把参数拼进去
		if(!where.isEmpty()){
			whereMap.put("check_time", where);
		}
		int page 	  = Integer.valueOf(params.get("page").toString());		// 当前显示页数
		int pageSize  = Integer.valueOf(params.get("pageSize").toString());	// 每页记录数
		// 区域查岗id
		String checkAreaId = params.get("area_id").toString();
		if(StringUtils.isNotBlank(checkAreaId)){
			whereMap.put("check_area_id", Integer.valueOf(checkAreaId));	// 值不为空时 把参数拼进去
			// 默认查询未应答数据
			int check_result = CheckResult.CHECK_RESULT_4;
			whereMap.put("check_result", check_result);
		}
		// 排序
		String sortorder = params.get("sortorder").toString();
		if(StringUtils.isNotBlank(sortorder)){
			if(sortorder.contains("desc")){
				sortMap.put("check_time", Constant.MONGODB_DESC);					// 降序排序
			}
			if(sortorder.contains("asc")){
				sortMap.put("check_time", Constant.MONGODB_ASC);					// 升序排序
			}
		}
		// MONGODB 查询结果集返回List
		List<QueryAreaCheck> list = mgTemplete.find(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER,whereMap,sortMap,page, pageSize,QueryAreaCheck.class,true);
		return list;
	}

	/**
	 * 当前登录人对应的区域查岗记录条数（ 查询15分钟之内的记录）
	 * @param params
	 * @return
	 */
	@SuppressWarnings("static-access")
	public Integer findAreaCheckCount(HashMap<String, Object> params) {
		Long count = 0L;
		// 查询条件封装
		HashMap<String, Object> whereMap = new HashMap<>();
		HashMap<String, Date> where = new HashMap<>();
		
		long curren = System.currentTimeMillis();// 系统时间
		Date endTime = new Date(curren);
		where.put("$lte", endTime);// 小于
		curren = curren - config.areaCheckTaskTimers;
		Date startTime = new Date(curren);
		where.put("$gte", startTime);// 大于
		
		// 值不为空时 把参数拼进去
		if(!where.isEmpty()){
			whereMap.put("check_time", where);
		}

		// 区域查岗id
		String checkAreaId = params.get("area_id").toString();
		if(StringUtils.isNotBlank(checkAreaId)){
			whereMap.put("check_area_id", Integer.valueOf(checkAreaId));	// 值不为空时 把参数拼进去
			// 默认查询未应答数据
			int check_result = CheckResult.CHECK_RESULT_4;
			whereMap.put("check_result", check_result);
		}
		
		count = mgTemplete.findCount(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER,whereMap);

		return count.intValue();
	}

	/**
	 * 当前登录人15分钟之内区域查岗应答是否有记录
	 * @param params
	 * @return
	 */
	@SuppressWarnings("static-access")
	public Long taskAreaCheck(HashMap<String, Object> params) {
		long count = 0L;
		// 查询条件封装
		HashMap<String, Object> whereMap = new HashMap<>();
		HashMap<String, Date> where = new HashMap<>();
		
		long curren = System.currentTimeMillis();// 系统时间
		Date endTime = new Date(curren);
		where.put("$lte", endTime);// 小于
		curren = curren - config.areaCheckTaskTimers;
		Date startTime = new Date(curren);
		where.put("$gte", startTime);// 大于
		// 值不为空时 把参数拼进去
		if(!where.isEmpty()){
			whereMap.put("check_time", where);
		}
		// 区域查岗id
		String checkAreaId = params.get("area_id").toString();
		if(StringUtils.isNotBlank(checkAreaId)){
			whereMap.put("check_area_id", Integer.valueOf(checkAreaId));	// 值不为空时 把参数拼进去
			// 默认查询未应答数据
			int check_result = CheckResult.CHECK_RESULT_4;
			whereMap.put("check_result", check_result);
		}
		// MONGODB 查询结果记录数
		count = mgTemplete.findCount(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER,whereMap);
		return count;
	}
	 
	/**
	 * 根据id查询区域查岗详情
	 * @param id
	 * @return
	 */
	@SuppressWarnings("static-access")
	public List<QueryAreaCheck> queryAreaCheckById(String id) {
		HashMap<String,Object> whereMap = new  HashMap<>();
		HashMap<String,Object> sortMap  = new HashMap<>();
		whereMap.put("_id", id);
		List<QueryAreaCheck> list = mgTemplete.find(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER, whereMap, sortMap,QueryAreaCheck.class,true);
		return list;
	}

	@SuppressWarnings("static-access")
	public void updateAreaCheck(QueryAreaCheck queryAreaCheck) {
		
		String _id = queryAreaCheck.get_id();
		if(_id != null && !"".equals(_id)){
			// where 条件
			BasicDBObject filter = new BasicDBObject().append("_id", _id);
			// 需要修改的字段			
			Document replacement = new Document();
			replacement.put("reply_content", queryAreaCheck.getReply_content());	// 回复内容
			replacement.put("reply_time", new Date());								// 回复时间
			replacement.put("check_result", queryAreaCheck.getCheck_result());		// 查岗结果
			Document update = new Document("$set",replacement);
			// 查询到数据只修改、无数据不插入
			UpdateOptions options = new UpdateOptions().upsert(false);
			mgTemplete.getCollection(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER)
			.updateMany(filter, update, options);
		}

		
	}

	@SuppressWarnings("static-access")
	public void updateAreaCheckByCheckTime(HashMap<String, Object> params) {
		try {
			// 区域查岗id
			String checkAreaId = params.get("area_id").toString();
			// 默认查询未应答数据
			int check_result = CheckResult.CHECK_RESULT_4;
			
			long curren = System.currentTimeMillis();// 系统时间
			curren = curren - 5*60 * 60 * 1000;
			Date startTime = new Date(curren);
			Document dateDoc = new Document("$lte",startTime);
			// where 条件
			BasicDBObject filter = new BasicDBObject()
								.append("check_area_id", Integer.valueOf(checkAreaId))
								.append("check_result", check_result)
								.append("check_time", dateDoc);
			
			// 需要修改的字段			
			Document replacement = new Document();
			replacement.put("check_result", CheckResult.CHECK_RESULT_3);	
			Document update = new Document("$set",replacement);		
			// 查询到数据只修改、无数据不插入
			UpdateOptions options = new UpdateOptions().upsert(false);
			
			mgTemplete.getCollection(MongodbConfig.MONGODB_DB, MongodbConfig.MONGODB_TABLE_POST_CHECK_INNER)
			.updateMany(filter, update, options);
		} catch (Exception e) {
			// TODO: handle exception
		}
		
	}
}
